/*----------------------------------------------------------------------------------------------------
** Created by        : [zhaoyang]
** Created date      : 2022-08-10
** Version           : 1.0
** Descriptions      : 测量数据处理程序
**---------------------------------------------------------------------------------------------------*/

#ifndef __DATA_HANDLE_H__
#define __DATA_HANDLE_H__

#include "flash_manage.h"

/***********************************************************************************/
//                  宏定义           
/***********************************************************************************/
#if 0
#define SPI_FLASH_CHIP_SIZE                                                               (16*1024*1024)

//预留存储资源使用 1M：图片字库这些
#define SPI_FLASH_RESOURCE_ADDR_START 						    0x0000
#define SPI_FLASH_RESOURCE_SIZE 							    (6 * 1024 * 1024)
#define SPI_FLASH_RESOURCE_ADDR_END 						    (SPI_FLASH_RESOURCE_ADDR_START + SPI_FLASH_RESOURCE_SIZE - 1)

//存储的数据的管理信息
#define SPI_FLASH_DATA_MANAGER_ADDR_START 					    (SPI_FLASH_RESOURCE_ADDR_END + 1)
#define SPI_FLASH_DATA_MANAGER_SIZE 						    (4 * 1024)
#define SPI_FLASH_DATA_MANAGER_ADDR_END 					    (SPI_FLASH_DATA_MANAGER_ADDR_START + SPI_FLASH_DATA_MANAGER_SIZE - 1)

//存储的运动记录信息
#define SPI_FLASH_SPORT_DATA_ADDR_START 					    (SPI_FLASH_DATA_MANAGER_ADDR_END + 1)
#define SPI_FLASH_SPORT_DATA_SIZE 						        (4 * 1024)
#define SPI_FLASH_SPORT_DATA_ADDR_END 					        (SPI_FLASH_SPORT_DATA_ADDR_START + SPI_FLASH_SPORT_DATA_SIZE - 1)

//运动实时速度数据
#define SPI_FLASH_SPEED_RT_DATA_ADDR_START 					    (SPI_FLASH_SPORT_DATA_ADDR_END + 1)
#define SPI_FLASH_SPEED_RT_DATA_SIZE 						    (1 * 1024 * 1024)
#define SPI_FLASH_SPEED_RT_DATA_ADDR_END 					    (SPI_FLASH_CHIP_SIZE - 1)
#endif

#define MCU_CS_PIN  26      //主控请求发送flash数据pin

#define HIS_DATA_CNT_MAX  5      //最大允许5条历史数据，超过了就不存储


#define TX_DATA_HEADER      0xAACC  //BLE/uart发送数据头部固定信息

#define SPORT_DATA_BUF_CNT  30      //每30s存储一次


/* 数据类型 */
enum
{
	DATA_TYPE_UART_NULL = 0,    //串口发送给MCU，无需数据传输
	DATA_TYPE_SPORT_DATA,       //运动数据
	DATA_TYPE_SPEED_RT_DATA,    //实时速度
	DATA_TYPE_HEART_DATA,       //心率
	DATA_TYPE_BAT_LEV,          //电量
};

#pragma pack(1)


//历史数据存储flash结构
typedef struct
{
    uint16_t    u16speed_rt_cnt;    //本次运动过程实时速度数据记录个数,数据为float类型，每个数据占4字节
    uint32_t    u32addr_start;      //存储起始地址，基于划分片区的offset，非flash的绝对地址
    uint32_t    u32addr_end;        //存储结束地址，基于划分片区的offset，非flash的绝对地址
}SPORTS_DATA_DETAIL_T ;


//历史数据存储flash结构
typedef struct
{
    uint32_t                    UTC;                //本次运动开始UTC
    uint32_t                    u32time_Sec;        //本次运动时长，单位: S

    SPORTS_DATA_DETAIL_T        sports_rt_info;      //实时速度，全程记录，每秒刷新一次，每分钟存储一次
}SPORT_DATA_HIS_INFO_T ;

//实时运动数据存储flash结构
typedef struct
{
    uint32_t    total_cnt;          //总数量，当前数量
    uint32_t    cur_offset;         //当前写新的记录起始地址；基于划分片区的offset，非flash的绝对地址
    uint8_t     reserved[8];        //预留
}SPORTS_RT_DATA_MANAGER_T;


//历史数据管理信息
typedef struct
{
    uint16_t                u16init_flag;       //固定AACC
    uint8_t                 u8his_cnt;          //历史数据记录条数
//    uint8_t                 u8his_start_index;  //历史数据记录起始索引；
    SPORTS_RT_DATA_MANAGER_T rt_data;         //实时运动数据存储信息
    uint8_t                 reserved[4];        //保留
    uint32_t                checksum;           //校验和
}SPORTS_DATA_MANAGER_T ;



//数据存储flash结构
typedef struct
{
    uint8_t     u8heart;                    //心率

    uint16_t    u16distance_total;          //根据经纬度计算出的距离，单位米
    uint16_t    u16step_total;              //总步数
    uint16_t    u16cal;                     //cal
        
    uint8_t     u8speed_rt;                 //实时速度m/s，放大10倍
    uint16_t     u16step_fre_rt;             //实时步频
    uint8_t     u8step_amplitude_rt;        //实时步幅
}SPORT_DATA_T ;


#pragma pack()

extern SPORT_DATA_HIS_INFO_T g_sport_data;
extern SPORTS_DATA_MANAGER_T g_his_data_manager_info;

void sports_his_data_del(void);
void sports_data_rt_upload(uint8_t u8index);
extern void BLE_tx_Running_bean_data_send(void);
extern void uart_his_data_send(void);
extern void his_data_manage_save(void);
extern void his_data_manage_init(void);
extern void sports_data_rt_save_flash(void);

extern void sport_data_sum_save_flash(void);


#endif // __DATA_HANDLE_H__

